
package coffee;

import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author bwolff
 */
public class ServerMessage {
    public String message;
    public Status status;
    public List<String> messages = new ArrayList<>();
    public List<Integer> value = new ArrayList<>();
    public List<String> info = new ArrayList<>();
    public List<String> warning = new ArrayList<>();
    private int price;
    private int caffeine;
    private int time;
    
//    privateGuiMessage guiMsg = new GuiMessage();
    String cmd; 
    
    public ServerMessage(String msg){
        this.cmd = msg;
        this.message = msg;
        translateMessage(msg);
    }
    
    public String getOrigMessage() {
        return message;
    }
    
    public void translateMessage(String cmd){        
        
        System.out.println(cmd);
        //List<String> tmpList = new ArrayList<>();     
        
        // Errors
        if(cmd.contains(String.valueOf(Constants.ERROR))){
            status = Status.ERROR;
            if(cmd.contains(String.valueOf(Constants.INSUFFICIANT))){
                if(cmd.contains(String.valueOf(Constants.ARABICA))) {
                    messages.add("Bitte füllen Sie Arabicabohnen nach und Bestätigen Sie!");
                    value.add(Constants.ARABICA);
                }
                if(cmd.contains(String.valueOf(Constants.ROBUSTA))) {
                    messages.add("Bitte füllen Sie Robustaabohnen nach und Bestätigen Sie!");
                    value.add(Constants.ROBUSTA);
                }
                if(cmd.contains(String.valueOf(Constants.ESPRESSO))) {
                    messages.add("Bitte füllen Sie Espressobohnen nach und Bestätigen Sie!");
                    value.add(Constants.ESPRESSO);
                }
                if(cmd.contains(String.valueOf(Constants.HAZELNUT))) {
                    messages.add("Bitte füllen Sie den Haselnusssirup auf und Bestätigen Sie!");
                    value.add(Constants.HAZELNUT);
                }
                if(cmd.contains(String.valueOf(Constants.CARAMEL))) {
                    messages.add("Bitte füllen Sie den Karamellsirup auf und Bestätigen Sie!");
                    value.add(Constants.CARAMEL);
                }
                if(cmd.contains(String.valueOf(Constants.MILK))) {
                    messages.add("Bitte füllen Sie Milch auf und Bestätigen Sie!");
                    value.add(Constants.MILK);
                }
                if(cmd.contains(String.valueOf(Constants.GARBAGE_LEVEL))) {
                    messages.add("Bitte leeren sie den Kaffeesatzbehälter und Bestätigen Sie!");
                    value.add(Constants.GARBAGE_LEVEL);
                }
                if(cmd.contains(String.valueOf(Constants.GREEN_TEA))) {
                    messages.add("Bitte füllen Sie den grünen Tee nach und Bestätigen Sie!");
                    value.add(Constants.GREEN_TEA);
                }
                if(cmd.contains(String.valueOf(Constants.BLACK_TEA))) {
                    messages.add("Bitte füllen Sie den schwarzen Tee nach und Bestätigen Sie!");
                    value.add(Constants.BLACK_TEA);
                }
                if(cmd.contains(String.valueOf(Constants.FRUIT_TEA))) {
                    messages.add("Bitte füllen Sie den Fürchtetee nach und Bestätigen Sie!");
                    value.add(Constants.FRUIT_TEA);
                }
            }    
            if(cmd.contains(String.valueOf(Constants.NEEDS_CLEANING))) {
                messages.add("Bitte reinigen Sie die Kaffeemaschine und Bestätigen Sie!");
                value.add(Constants.NEEDS_CLEANING);
            }
            if(cmd.contains(String.valueOf(Constants.COFFEE_IN_USE))) {
                messages.add("Die Kaffeeeinheit ist gerade in Benutzung!");
                value.add(Constants.COFFEE_IN_USE);
            }
            if(cmd.contains(String.valueOf(Constants.TEA_IN_USE))) {
                messages.add("Die Teeeinheit ist gerade in Benutzung!");
                value.add(Constants.TEA_IN_USE);
            }
            if(cmd.contains(String.valueOf(Constants.INVALID_COMMAND))) {
                messages.add("Unbekanntes Kommando gesendet!");
                value.add(Constants.INVALID_COMMAND);
            }
            if(cmd.contains(String.valueOf(Constants.INVALID_PARAMETER))) {
                messages.add("Unbekannter Parameter wurde gesendet!");
                value.add(Constants.INVALID_PARAMETER);
            }
            if(cmd.contains(String.valueOf(Constants.GARBAGE_INSUFFICIANT))) {
                messages.add("Bitte leeren Sie denn Müll und Bestätigen Sie!");
                value.add(Constants.GARBAGE_INSUFFICIANT);
            }
        }
          
        else if(cmd.contains(String.valueOf(Constants.ACCEPTED_COFFEE)) || cmd.contains(String.valueOf(Constants.ACCEPTED_TEA)) ||
                cmd.contains(String.valueOf(Constants.READY_COFFEE)) || cmd.contains(String.valueOf(Constants.READY_TEA))) {
            status = Status.CONFIRM;
            int index = cmd.indexOf(String.valueOf(Constants.INFO));
            
            List<Integer> listIdx = new ArrayList<>();
            
            // Statusmeldungen            
            if(cmd.contains(String.valueOf(Constants.ACCEPTED_COFFEE))) {
                messages.add("Kaffe wird zubereitet!");
                value.add(Constants.ACCEPTED_COFFEE);
                String[] cmdArr = cmd.split(" ");
                this.time = Integer.parseInt(cmdArr[1]);                
            }
                        
            if(cmd.contains(String.valueOf(Constants.ACCEPTED_TEA))) {
                messages.add("Tee wird zubereitet!");
                value.add(Constants.ACCEPTED_TEA);
                String[] cmdArr = cmd.split(" ");
                this.time = Integer.parseInt(cmdArr[1]);      
            }
            
            if(cmd.contains(String.valueOf(Constants.READY_COFFEE))) {
                messages.add("Kaffeezubereitung fertig!");
                value.add(Constants.READY_COFFEE);
            }
            
            if(cmd.contains(String.valueOf(Constants.READY_TEA))) {
                messages.add("Teezubereitung fertig!");
                value.add(Constants.READY_TEA);
            }
            
            
            while (index >= 0) {
                listIdx.add(index);
                index = cmd.indexOf(String.valueOf(Constants.INFO),index+1);
            }
            // Get Info
            int size = listIdx.size();
            int i = 0;
            if (size == 1){
                info.add(cmd.substring(listIdx.get(0)+3));
                cmd = cmd.substring(0, listIdx.get(0));            
            }
            else if(size > 1) {         
                for (;i<size-1;i++){
                     info.add(cmd.substring(listIdx.get(i)+3,listIdx.get(i+1)-1));
                }
                info.add(cmd.substring(listIdx.get(i)+3));
                cmd = cmd.substring(0,listIdx.get(0));
            }
            
            for(String str : info){
                if(str.contains(String.valueOf(Constants.CAFFEINE))){
                    this.caffeine = Integer.parseInt(str.substring(3));
                    System.out.println("Koffein: "  + caffeine);
                }
                else if (str.contains(String.valueOf(Constants.PRICE))){
                    this.price = Integer.parseInt(str.substring(3));
                    System.out.println("Preis: "  + price);
                }
            }

            // Get Warnings
            listIdx = new ArrayList<>();
            i = 0;
            while (index >= 0) {
                listIdx.add(index);
                index = cmd.indexOf(String.valueOf(Constants.WARNING),index+1);
            }
            size = listIdx.size();
            if (size == 1){
                warning.add(cmd.substring(listIdx.get(0)+3));
                cmd = cmd.substring(0, listIdx.get(0));            
            }
            else if(size > 1) {           
                for (;i<size-1;i++){
                     warning.add(cmd.substring(listIdx.get(i)+3,listIdx.get(i+1)-1));
                }
                warning.add(cmd.substring(listIdx.get(i)+1));
                cmd = cmd.substring(0,listIdx.get(0));
            }
        
        }else {
            status = Status.CONFIRM;
            String[] split = cmd.split(" ");
            List<Integer> listIdx = new ArrayList<>();
            
            for(String s : split) {
                listIdx.add(Integer.parseInt(s));
            }
            
            if(listIdx.contains(Constants.PRICE)) {
                this.price = listIdx.get(listIdx.size() - 1);
            } else if(listIdx.contains(Constants.CAFFEINE)) {
                this.caffeine = listIdx.get(listIdx.size() - 1);
            }
        }
            
    }
    
    public String getMessage() {
        StringBuilder output = new StringBuilder();
        for(int i = 0; i < messages.size(); i++) {
            output.append(messages.get(i));
            if(i < messages.size() - 1) {
                output.append("\n");
            }
        }
        
        return output.toString();
    }
    
    public enum Status {
        ERROR,
        CONFIRM
    }
    
    public int getPrice(){
        return this.price;
    }
    
    public int getCaffeine(){
        return this.caffeine;
    }
    
    public int getTime(){
        return this.time;
    }
    
}